//package com.fuershiye.woman.monitor.controller;
//
//import com.fuershiye.woman.monitor.beans.IdName;
//import com.fuershiye.woman.monitor.beans.PageResult;
//import com.fuershiye.woman.monitor.beans.Result;
//import com.fuershiye.woman.monitor.constants.Massage;
//import com.fuershiye.woman.monitor.constants.ReportType;
//import com.fuershiye.woman.monitor.constants.StringLockPrefix;
//import com.fuershiye.woman.monitor.model.DepartIndicator;
//import com.fuershiye.woman.monitor.model.Department;
//import com.fuershiye.woman.monitor.model.FormsDepart;
//import com.fuershiye.woman.monitor.model.Indicator;
//import com.fuershiye.woman.monitor.service.*;
//import com.fuershiye.woman.monitor.utils.DateFormatUtil;
//import com.fuershiye.woman.monitor.utils.MyUtilString;
//import com.fuershiye.woman.monitor.utils.ReportUtil;
//
//import com.google.common.collect.Interner;
//import com.google.common.collect.Interners;
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.poi.ss.usermodel.*;
//import org.apache.shiro.SecurityUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Controller;
//import org.springframework.ui.Model;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.ResponseBody;
//import org.springframework.web.multipart.MultipartFile;
//import org.springframework.web.multipart.commons.CommonsMultipartFile;
//
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//
///**
// * 导入管理
// *
// * @author yongyongdong
// *
// */
//@Controller
//@RequestMapping(value = "/import")
//public class ImportController {
//
//	private static final Logger logger = LoggerFactory
//			.getLogger(ImportController.class);
//
//	@Autowired
//	IndicatorService indicatorService;
//	@Autowired
//	ReportService reportService;
//	@Autowired
//	FormsService formsService;
//	@Autowired
//	DepartmentService departmentService;
//	@Autowired
//	DepartIndicatorService departIndicatorService;
//	@Autowired
//	FormsDepartService formsDepartService;
//	@Autowired
//	UserService userService;
//
//
//	//	@RequiresPermissions("area:view")
//	@RequestMapping(value = "/view.do")
//	public String view(String show, Model model) {
//
//		List<IdName> formes = formsService.getAllNames();
//		model.addAttribute("formes", formes);
//
//		List<Integer> years = DateFormatUtil.getAreaYears();
//		model.addAttribute("years", years);
//
//		return "report/" + show;
//	}
//
//	@RequestMapping(value = "/sync/excel.do")
//	@ResponseBody
//	public Result syncExcelYear(@RequestParam("file") MultipartFile file,
//								@RequestParam(value="year" ,required =true ) Integer year,
//								@RequestParam(value="formsid" ,required =true ) Long formsid,
//								@RequestParam(value="departid" ,required =true ) Long departid) {
//
//		if (file == null) {
//			logger.error("syncExcel no file");
//			return new Result(Massage.FILE_IS_NULL);
//		}
//		if(!DateFormatUtil.isYear(year)){
//			logger.error("syncExcel no year");
//			return new Result(Massage.ERROR_YEAR);
//		}
//		if(formsid==null||formsid==0){
//			logger.error("syncExcel no formsid");
//			return new Result(Massage.FORMS_IS_NULL);
//		}
//		if(departid==null||departid==0){
//			logger.error("syncExcel no department");
//			return new Result(Massage.DEPART_IS_NULL);
//		}
//		Department department = departmentService.get(departid);
//		if(department==null){
//			logger.error("syncExcel department is null!");
//			return new Result(Massage.DEPART_IS_NULL);
//		}
//
//		String fileName = ((CommonsMultipartFile) file).getFileItem().getName();
//		if (!fileName.endsWith("xls") && !fileName.endsWith("xlsx")) {
//			return new Result(Massage.FILE_IS_TYPE);
//		}
//
//		FormsDepart formsDepart = formsDepartService.findByDepartYearForms(departid, year, formsid);
//		/** 各部门,各年份,各报表的状态
//		 *  0:删除(默认),
//		 *  1:未上报(一个指标都没有上报);
//		 *  2:上报中(部分上报);
//		 *  3:审核(自己审核);
//		 *  4:审核(上级部门);
//		 *  5:审核通过(不允许修改);
//		 *  6:其他;
//		 * */
//		if(formsDepart==null||formsDepart.getStatus()==null){
//			logger.error("syncExcel forms depart is null!");
//			return new Result(Massage.FORMS_DEPART_IS_NULL);
//		}
//		if(formsDepart.getStatus()>2){
//			logger.error("syncExcel forms depart is exist!");
//			return new Result(Massage.REPORT_EXIST);
//		}
//
//		//避免多人同事操作相同文件，排队处理
//		Interner<String> pool = Interners.newWeakInterner();
//		synchronized (pool.intern(StringLockPrefix.LOCK_IMPORT_EXCEL+fileName)){
//
//			Workbook workbook = null;
//			try {
//				workbook = WorkbookFactory.create(file.getInputStream());
//			} catch (Exception ex) {
//				ex.printStackTrace();
//				return new Result(Massage.FILE_IS_TYPE);
//			}
//			if(workbook==null){
//				return new Result(Massage.IMPORT_IS_ERROR);
//			}
//			return dealWorkbook(workbook, formsid, year, departid);
//		}
//	}
//
//	/**
//	 * 处理同一个年份，格式：
//	 * row		0		1		2			3			4
//	 * 		指标名名称	编码		格式			数值			备注(控制在30字符以内)
//	 * 		生产总值		A01		数值			82			备注的信息啊
//	 * 		生产总值		A02		数值			183			备注的信息啊
//	 * 		生产总值		A03		空值			NULL		备注的信息啊
//	 * 		生产总值		A03		暂无数据		NULL		备注的信息啊
//	 * 		生产总值		A04		18:25		时间			备注的信息啊
//	 * */
//	private Result dealWorkbook(Workbook workbook, long formsid, int year, long departid) {
//		if (workbook == null) {
//			return new Result(Massage.FILE_IS_TYPE);
//		}
//		//默认取得第一个sheet
//		Sheet sheet = workbook.getSheetAt(0);
//		if(sheet==null){
//			return new Result(Massage.FILE_SHEET_IS_NULL);
//		}
//
//		List<Map> result = Lists.newArrayList();
//		for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) {
//
//			Row row = sheet.getRow(i);
//			if(row==null){
//				logger.error("row is null!");
//				continue;
//			}
//			List<Map> checkOne = checkValue(row, 0);
//			if(!checkOne.isEmpty()){
//				result.addAll(checkOne);
//				continue;
//			}
//
//			Indicator indicator = indicatorService.findByCodeForms(getCellValue(row.getCell(1)), formsid);
//			if(indicator==null){
//				Map<String, Object> map = Maps.newHashMap();
//				map.put("error","找不到对应的指标");
//				map.put("value",getCellValue(row.getCell(0)));
//				result.add(map);
//				logger.error("indicator is null! code:{}",getCellValue(row.getCell(1)));
//				continue;
//			}
//
//			DepartIndicator departIndicator = departIndicatorService.findByCondition(departid, formsid, indicator.getId(), year, null);
//			//更新数据，是否是新增
//			if(null == departIndicator){
//				departIndicator = new DepartIndicator();
//				departIndicator.setCtime(new Date());
//				Department department = departmentService.get(Long.valueOf(departid));
//				if(department==null){
//					return new Result(Massage.DEPART_IS_NULL);
//				}
//			}
//			departIndicator.setDepartid(departid);
//			departIndicator.setForms(formsid);
//			departIndicator.setIndicator(indicator.getId());
//			departIndicator.setMtime(new Date());
//			departIndicator.setStatus(1);
//			departIndicator.setEditor(ReportUtil.getEditor(null));
//
//			departIndicatorService.save(departIndicator);
//			departIndicator = departIndicatorService.findByCondition(departid, formsid, indicator.getId(), year, 1);
//
//			ReportType reportType = ReportType.getByName(getCellValue(row.getCell(2)));
//			int type = reportType.getId();
//			Double valueDoube = ReportType.getValueByType(type, getCellValue(row.getCell(3)));
//			String remark = getCellValue(row.getCell(4));
//
//			reportService.saveReport(departIndicator.getId(), year, type, valueDoube, ReportUtil.getEditor(null), remark);
//		}
//
//		return new Result(Massage.SUCCESS, new PageResult(result, result.size()));
//	}
//
//
//	@RequestMapping(value = "/sync/excel/user.do")
//	@ResponseBody
//	public Result syncExcelDepart(@RequestParam("file") MultipartFile file,
//								  @RequestParam(value="formsid" ,required =true ) Long formsid) {
//
//		if (file == null) {
//			logger.error("syncExcel no file");
//			return new Result(Massage.FILE_IS_NULL);
//		}
//		if(formsid==null||formsid==0){
//			logger.error("syncExcel no formsid");
//			return new Result(Massage.FORMS_IS_NULL);
//		}
//
//		String fileName = ((CommonsMultipartFile) file).getFileItem().getName();
//		if (!fileName.endsWith("xls") && !fileName.endsWith("xlsx")) {
//			return new Result(Massage.FILE_IS_TYPE);
//		}
//
//		//避免多人同事操作相同文件，排队处理
//		Interner<String> pool = Interners.newWeakInterner();
//		synchronized (pool.intern(StringLockPrefix.LOCK_IMPORT_EXCEL+fileName)){
//
//			Workbook workbook = null;
//			try {
//				workbook = WorkbookFactory.create(file.getInputStream());
//			} catch (Exception ex) {
//				ex.printStackTrace();
//				return new Result(Massage.FILE_IS_TYPE);
//			}
//			if(workbook==null){
//				return new Result(Massage.IMPORT_IS_ERROR);
//			}
//			return dealWorkbookYears(workbook, formsid);
//		}
//	}
//
//	/**
//	 * 处理多个年份，格式：
//	 * row		0		1		2			3			4				5			6			7
//	 * 		指标名名称	编码		2010格式		2010数值		2010备注			2011格式		2011数值		2011备注
//	 * 		生产总值		A01		数值			82			备注的信息啊		数值			82			备注的信息啊
//	 * 		生产总值		A02		数值			183			备注的信息啊		数值			82			备注的信息啊
//	 * 		生产总值		A03		空值			NULL		备注的信息啊		时间			18:25		备注的信息啊
//	 * 		生产总值		A03		暂无数据		NULL		备注的信息啊		暂无数据		NULL		备注的信息啊
//	 * 		生产总值		A04		时间			18:25		备注的信息啊		数值			82			备注的信息啊
//	 * */
//	private Result dealWorkbookYears(Workbook workbook, long formsid) {
//
//		if (workbook == null) {
//			return new Result(Massage.FILE_IS_TYPE);
//		}
//		//默认取得第一个sheet，第一个sheet 里必须大于两行
//		Sheet sheet = workbook.getSheetAt(0);
//		if(sheet==null || sheet.getLastRowNum()<1){
//			return new Result(Massage.FILE_SHEET_IS_NULL);
//		}
//
//		Row rowHearder = sheet.getRow(0);
//		List<Map> result = checkHeader(rowHearder);
//		/** 表头不对 */
//		if(!result.isEmpty()){
//			return new Result(Massage.FILE_IS_TYPE, new PageResult(result, result.size()));
//		}
//
//		Department department = userService.getDepartIdByName(SecurityUtils.getSubject().getPrincipal() + "");
//		if(department==null||department.getId()==null||department.getId()==0){
//			return new Result(Massage.DEPART_IS_NULL);
//		}
//
//		int hearderSept = (rowHearder.getLastCellNum()-2)/3;
//
//		for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) {
//
//			Row row = sheet.getRow(i);
//			String code = getCellValue(row.getCell(1));
//			if(code.isEmpty()){
//				continue;
//			}
//			Indicator indicator = indicatorService.findByCodeForms(code, formsid);
//			if (indicator == null) {
//				Map<String, Object> map = Maps.newHashMap();
//				map.put("error", "找不到对应的指标");
//				map.put("value", getCellValue(row.getCell(0)));
//				result.add(map);
//				logger.error("indicator is null! code:{}", getCellValue(row.getCell(1)));
//				continue;
//			}
//
//			for (int j = 0; j < hearderSept; j++) {
//
//				List<Map> checkOne = checkValue(row, j * 3);
//				if (!checkOne.isEmpty()) {
//					result.addAll(checkOne);
//					continue;
//				}
//
//				int index = j * 3 + 2;
//				String typeStr = getCellValue(row.getCell(index));
//				int type = ReportType.getByName(typeStr).getId();
//				String valueStr = getCellValue(row.getCell(index + 1)).toString();
//				String markStr = getCellValue(row.getCell(index + 2)).toString();
//				String yearStr = MyUtilString.subStr(getCellValue(rowHearder.getCell(index)), MyUtilString.MYUTIL_TYPE);
//				int year = Integer.parseInt(yearStr);
//				Double value = ReportType.getValueByType(type, valueStr);
//
//				DepartIndicator departIndicator = departIndicatorService.findByCondition(department.getId(), formsid, indicator.getId(), year, null);
//				//更新数据，是否是新增
//				if (departIndicator == null) {
//					departIndicator = new DepartIndicator();
//					departIndicator.setCtime(new Date());
//				}
//				departIndicator.setDepartid(department.getId());
//				departIndicator.setForms(formsid);
//				departIndicator.setIndicator(indicator.getId());
//				departIndicator.setMtime(new Date());
//				departIndicator.setStatus(1);
//				departIndicator.setEditor(ReportUtil.getEditor(null));
//
//				departIndicatorService.save(departIndicator);
//				departIndicator = departIndicatorService.findByCondition(department.getId(), formsid, indicator.getId(),year,1);
//
//				FormsDepart formsDepart = formsDepartService.findByDepartYearForms(department.getId(), year, formsid);
//
//				/** 各部门,各年份,各报表的状态
//				 *  0:删除(默认),
//				 *  1:未上报(一个指标都没有上报);
//				 *  2:上报中(部分上报);
//				 *  3:审核(自己审核);
//				 *  4:审核(上级部门);
//				 *  5:审核通过(不允许修改);
//				 *  6:其他;
//				 * */
//				if(formsDepart==null||formsDepart.getStatus()==null){
//					logger.error("syncExcel forms depart is null!");
//					Map<String, Object> map = Maps.newHashMap();
//					map.put("error",Massage.FORMS_DEPART_IS_NULL.getMsg());
//					map.put("value","部门："+department.getId()+",年份:"+year+",报表"+formsid);
//					result.add(map);
//				}else if(formsDepart.getStatus()>2){
//					logger.error("syncExcel forms depart is exist!");
//					Map<String, Object> map = Maps.newHashMap();
//					map.put("error",Massage.REPORT_EXIST.getMsg());
//					map.put("value","部门："+department.getId()+",年份:"+year+",报表"+formsid);
//					result.add(map);
//				}else{
//					reportService.saveReport(departIndicator.getId(), year, type, value, ReportUtil.getEditor(null), markStr);
//				}
//
//			}
//		}
//		return new Result(Massage.SUCCESS, new PageResult(result, result.size()));
//	}
//
//
//	/**
//	 * 校验多个年份，数据格式：
//	 * row		0		1		2			3			4				5			6			7
//	 * 		指标名名称	编码		2010格式		2010数值		2010备注			2011格式		2011数值		2011备注
//	 * 		生产总值		A01		数值			82			备注的信息啊		数值			82			备注的信息啊
//	 * 		生产总值		A02		数值			183			备注的信息啊		数值			82			备注的信息啊
//	 * 		生产总值		A03		空值			NULL		备注的信息啊		时间			18:25		备注的信息啊
//	 * 		生产总值		A03		暂无数据		NULL		备注的信息啊		暂无数据		NULL		备注的信息啊
//	 * 		生产总值		A04		时间			18:25		备注的信息啊		数值			82			备注的信息啊
//	 *
//	 * 	index 只能是3的倍数
//	 *
//	 * */
//	private List<Map> checkValue(Row row, Integer index){
//
//		List<Map> result = Lists.newArrayList();
//
//		/** 指标编码*/
//		if(StringUtils.isEmpty(getCellValue(row.getCell(1)))){
//			logger.error("indicator code is null!");
//			Map<String, Object> map = Maps.newHashMap();
//			map.put("error","指标编码为空");
//			map.put("value",getCellValue(row.getCell(1)));
//			result.add(map);
//		}
//		logger.info("import code:{}", getCellValue(row.getCell(1)));
//
//		ReportType reportType = ReportType.getByName(getCellValue(row.getCell(index+2)));
//		if(reportType==null){
//			Map<String, Object> map = Maps.newHashMap();
//			map.put("error","数据格式不对!");
//			map.put("value",
//					"指标编码："+getCellValue(row.getCell(1))
//					+", 格式："+getCellValue(row.getCell(index+2)));
//			result.add(map);
//		}
//		int type = reportType.getId();
//
//		Double valueDoube = ReportType.getValueByType(type, getCellValue(row.getCell(index+3)));
//		if((type==1||type==4) && valueDoube==null){
//			Map<String, Object> map = Maps.newHashMap();
//			map.put("error","数据不对!");
//			map.put("value",
//					"指标编码："+getCellValue(row.getCell(1))
//					+", 数值："+getCellValue(row.getCell(index+3)));
//			result.add(map);
//		}
//		String remark = getCellValue(row.getCell(index+3));
//		if(remark!=null && remark.length()>50){
//			Map<String, Object> map = Maps.newHashMap();
//			map.put("Error","备注太长");
//			map.put("value",
//					"指标编码："+getCellValue(row.getCell(1))
//					+", 备注："+getCellValue(row.getCell(index+4)));
//			result.add(map);
//			logger.error("indicator is null! code:{}",getCellValue(row.getCell(1)));
//		}
//		return result;
//	}
//
//	/** 检查多个年份导入时的格式 */
//	private List<Map> checkHeader(Row rowHearder) {
//
//		List<Map> result = Lists.newArrayList();
//
//		/** 表头列的数量校验 */
//		int hearderSize = rowHearder.getLastCellNum();
//		if(hearderSize<5 || (((hearderSize-2)%3)!=0)){
//			Map<String, Object> map = Maps.newHashMap();
//			map.put("error","模板被修改了");
//			map.put("value","列数不对!");
//			result.add(map);
//			logger.error("model is change!");
//			return result;
//		}
//
//		/** 查看表头是否有空格 */
//		for (int i = 2; i < rowHearder.getLastCellNum(); i++) {
//			if(rowHearder.getCell(i) == null || "".equals(rowHearder.getCell(i))){
//				Map<String, Object> map = Maps.newHashMap();
//				map.put("error","模板被修改了，第一行不允许有空格出现");
//				map.put("value","第一行，第"+(i-1)+"个，不能为空格");
//				result.add(map);
//				logger.error("model is change!");
//				return result;
//			}
//		}
//
//		int hearderSept = (hearderSize-2)/3;
//		for (int i = 0; i <hearderSept; i++) {
//
//			int index = i*3+2;
//			String typeStr = rowHearder.getCell(index).toString();
//			String valueStr = rowHearder.getCell(index+1).toString();
//			String markStr = rowHearder.getCell(index+2).toString();
//
//			if(!typeStr.contains(MyUtilString.MYUTIL_TYPE)){
//				Map<String, Object> map = Maps.newHashMap();
//				map.put("error","模板被修改了");
//				map.put("value",typeStr+"格式不对");
//				result.add(map);
//			}
//			if(!valueStr.contains(MyUtilString.MYUTIL_VALUE)){
//				Map<String, Object> map = Maps.newHashMap();
//				map.put("error","模板被修改了");
//				map.put("value",valueStr+"数值不对");
//				result.add(map);
//			}
//			if(!markStr.contains(MyUtilString.MYUTIL_MARK)){
//				Map<String, Object> map = Maps.newHashMap();
//				map.put("error","模板被修改了");
//				map.put("value",markStr+"备注不对");
//				result.add(map);
//			}
//
//			String year1= MyUtilString.subStr(typeStr, MyUtilString.MYUTIL_TYPE);
//			String year2= MyUtilString.subStr(valueStr, MyUtilString.MYUTIL_VALUE);
//			String year3= MyUtilString.subStr(markStr, MyUtilString.MYUTIL_MARK);
//
//			if(!DateFormatUtil.isYear(year1)
//				||!year1.equals(year1)
//				||!year1.equals(year3)
//				||!year2.equals(year3)){
//
//				Map<String, Object> map = Maps.newHashMap();
//				map.put("error","模板被修改了");
//				map.put("value","格式不对"+typeStr+valueStr+markStr);
//				result.add(map);
//			}
//		}
//
//		return result;
//	}
//
//	private String getCellValue(Cell cell) {
//
//		if(cell==null){
//			return "";
//		}
//
//		cell.setCellType(Cell.CELL_TYPE_STRING);
//
//		if(StringUtils.isBlank(cell.getStringCellValue())){
//			return "";
//		}
//		return cell.getStringCellValue().trim().replace(" ","");
//	}
//
//}
